package externaldata.passageTrainReel;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class PassageTrainReelHandler extends DefaultHandler {
	
	// Résultats de notre parsing 
	private List<PassageTrainReel> prochainsTrains;
	private PassageTrainReel currentTrain;
	
	// Flags nous indiquant la position du parseur 
	private boolean inTrain = false;
	
	private String currentStringValue;
	
	
	// Détection d'ouverture de balise 
	public void startElement(String namespaceUri, String localName, String rawName, Attributes attributes) throws SAXException {

		if (rawName.equals("passages")) {
			prochainsTrains = new ArrayList<PassageTrainReel>();
		}
		else if (rawName.equals("train")) {
			inTrain = true;
		}
		else if (rawName.equals("date") && inTrain) {
			
			// Si l'attribut est à 'R', alors on crée un nouvel objet TrainData, sinon on passe au train suivant
			if (attributes.getLength() == 1
					&& attributes.getLocalName(0).equals("mode")
					&& attributes.getValue(0).equals("R")) {
				currentTrain = new PassageTrainReel();
				currentStringValue = "";
			}
			else {
				inTrain = false;
			}
		}
		else if (rawName.equals("num") && inTrain) {
			currentStringValue = "";
		}
		else if (rawName.equals("miss") && inTrain) {
			currentStringValue = "";
		}
		else if (rawName.equals("term") && inTrain) {
			currentStringValue = "";
		}
	}
	
	// Détection de fermeture de balise 
	public void endElement(String namespaceUri, String localName, String rawName) throws SAXException {
		
		if (rawName.equals("train") && inTrain) {
			prochainsTrains.add(currentTrain);
			inTrain = false;
		}
		else if (rawName.equals("date") && inTrain) {
			
			try {
				currentTrain.setArriveeGare(new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(currentStringValue));
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		else if (rawName.equals("num") && inTrain) {
			
			currentTrain.setNumeroTrain(currentStringValue);
			
			// Patch : vérifier si c'est bien 6 chiffres, 
			// sinon inTrain => false pour stopper la récup d'info sur ce train
			if (!currentStringValue.matches("^[\\d]{6}$")) {
				inTrain = false;
			}
		}
		else if (rawName.equals("miss") && inTrain) {
			currentTrain.setNomTrain(currentStringValue);
		}
		else if (rawName.equals("term") && inTrain) {
			currentTrain.setDestinationUic(currentStringValue);
		}
	}
	
	// Détection de caractères
	public void characters(char[] ch, int start, int length) throws SAXException {
		currentStringValue = new String(ch, start, length);
	}
	
	// Méthode de récupération du résultat parsé
	public List<PassageTrainReel> getTrainList() {
		return prochainsTrains;
	}
}
